home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
masm.arc
/
SD24.ASM
< prev
next >
Wrap
Assembly Source File
|
1985-03-06
|
32KB
|
699 lines
TITLE SD - SORTED DIRECTORY V3.0
PAGE 64,132 ; 3/24/84
COMMENT |
SD [d:][filename[.ext]] [options]
[filespec] same as for DIR command
[options] * /A - List hidden files.
* /E - Without screen erase.
* /W - Don't wait when screen full. djm
* /R - Include directory entries (high intensity) djm
* /M - Display Modified entries only djm
/X - Sort by extension.
/S - Sort by size.
/D - Sort by date/time.
/N - Do not sort, original order.
/H - Help - only display options djm
Default = *.* sorted by name.ext with screen erase.
* - Option may be combined with other options.
This source file was created from an object file obtained
from Gene Plantz's BBS in Chicago. The original file name
was SD.HEX. I then used DEBUG and CAPTURE to get the first
dis-assembly which was then edited with WORDSTAR to create
a source that when assembled using MASM would duplicate the
original object file.
Comments have been added and I do hope they are helpful.
I have made several modifications to the first version and
am continuing to add comments. This source file is an
excellent example for anyone wishing to learn 8086/8088
assembly language. Use at your own risk and feel free to
share this file with your friends.
I certainly wish that John Chapman would publish his
source file. His comments are sure to be more meaningful
than mine could ever be. Some of the conversion routines
are very elegant, but difficult to understand. As far as
I'm concerned, PRINTDD is magic.
Several modifications have been made. They are:
1. Filespecs are processed like DIR does.
2. No sort option was added. /N
3. Pause when screen full option added. /P changed to /W by DJM
4. Number of files found is printed.
Ted Reuss
Houston, TX
SDIR Version 2.2 The GETFREE Subroutine was updated for DOS 2.0
April 1, 1983 by Jack Y. Fong
Changes are denoted by "JYF" at the end of changed lines.
I (Dave Mc Laughlin) have also made several modifications: (V 3.0)
Pause is now standard unless /P is entered to defeat
Color is now supported on color monitors
Free space is now reported at the bottom, along with
directory total (to give an idea of how many diskettes
may be required for backup)
Volume and current directory are shown on the top line
(my apologies to Capitol PC Club for removing their logo)
Modified files are shown with a + sign in place of the .
The /R option (show sub directory names) has been added
The /P option was changed to /W(ait) and /M (modified only) added
NOTE: THIS MODIFIED VERSION REQUIRES DOS 2.0 AND ANSI.SYS TO
BE INSTALLED - SEE DOS REFERENCE MANUAL PAGE 13-2
|
SUBTTL EQUATES & STRUCTURES
PAGE
IF1
DOSCALL MACRO FUNC,PARM1
.xcref
F_C = FUNC
IFNB <PARM1>
IF F_C EQ 2 OR (F_C GE 4 AND F_C LE 6) OR F_C EQ 14 OR F_C EQ 46
MOV DL,PARM1
ELSE
MOV DX,OFFSET PARM1
ENDIF
ENDIF
MOV AH,FUNC
INT 21H
.cref
ENDM
ENDIF
.SALL ;supress all macro expansions
; PC-DOS INTERRUPT 21H FUNCTION CODES
;
@CHROUT EQU 2 ;display char in DL
@KEYIN EQU 8 ;kybd input w/o echo
@STROUT EQU 9 ;print string terminated with $
@CKEYIN EQU 12 ;clr kybd bufr & do inp.func in AL
@SRCH1 EQU 17 ;search for first dir entry
@SRCH2 EQU 18 ;search for next dir entry
@GETDSK EQU 25 ;get default disk drive
@SETDTA EQU 26 ;set disk transfer addr
@FATAD2 EQU 28 ;get FAT of drive # in DL
@PARSEF EQU 41 ;parse filename
@GETDTE EQU 42 ;get system date
@GETTME EQU 44 ;get system time
@DSKFSP EQU 36H ;get disk free space JYF
@GETVER EQU 30H ;get version number JYF
@GETDIR EQU 47H ;get directory djm
CR EQU 0DH ;carriage return
LF EQU 0AH ;line feed
FCB_1 EQU 5CH ;fcb for parameter 1
PARAM_L EQU 80H ;# characters in PARAM_B
PARAM_B EQU 81H ;DOS cmd parameter buffer.
; PC-DOS packed date <yyyyyyym mmmddddd>
P_DTE RECORD P_YR:7,P_MO:4,P_DY:5
; PC-DOS packed time <hhhhhmmm mmmsssss>
P_TME RECORD P_HR:5,P_MI:6,P_2S:5
DIRNTRY STRUC ;directory entry structure
LNK DW 0 ;ptr to next entry
NAM DB 8 DUP(0),'.' ;filename
EXT DB 3 DUP(0) ;extension
TME DW 0 ;time
DTE DW 0 ;date
SZL DW 0 ;low word of size
SZH DW 0 ;high word of size
DIRNTRY ENDS
SUBTTL DATA AREA & INITIALIZATION
PAGE
SDIR SEGMENT PUBLIC 'CODE'
ASSUME CS:SDIR,DS:SDIR,ES:SDIR
ORG 100H
MAIN PROC FAR
JMP STARTS
DIRWRK DB 64 DUP (' ') ;directory work area djm
SCRCOL DB 27,'[33;44m$' ; brown on blue djm
CLS DB 27,'[2J$' ;clear screen seq for 2.0 djm
ROOT DB '* * ROOT * *',8 DUP (' ') ; djm
HI_INT DB 27,'[1m$' ;high intensity for dir entry djm
BROWN DB 27,'[0;33;44m$' ;return to brown foreground djm
DIRSW DB 0 ;0=this is not a directory entry djm
TOTL DW 0 ;low order word of total size used djm
TOTH DW 0 ;high order djm
DIRLNK DW DIRBUF ;ptr to next opening in DIRBUF
C1LNK DW 0 ;ptr to row 1, column 1
C2LNK DW 0 ;ptr to row 1, column 2
NBRFILS DW 0 ;# of files or detail lines
SRTFLG DB 0 ;if = 0 then sort else no sort
CLSFLG DB 0 ;if = 0 then clear screen
EXTFLG DB 0 ;if <> 0 then sort by ext
SIZFLG DB 0 ;if <> 0 then sort by size
DTEFLG DB 0 ;if <> 0 then sort by date/time
PSEFLG DB 'W' ;if <> 0 then pause if screen full djm
MODFLG DB 0 ;if <> 0 then display modified only djm
OPTFLG DB 0 ;if <> 0 then display options (no directory)djm
LPERSCR EQU 25 ;Lines per screen
LINCNT DB LPERSCR-4 ;Number of lines left
PSEMSG DB 27,'[32mStrike a key when ready . . . ' ; djm
DB 27,'[33m$' ;return color to brown djm
HDNG1 DB 'Vol: ',27,'[31;43m' ;red on brown background djm
VOLLOC DB 11 DUP (' ') ;put volume label here djm
DB 27,'[33;44m ' ;set color back to normal djm
DB 'Dir: ',27,'[31;43m' ;red on brown background djm
DIRLOC DB 17 DUP (' ') ;put directory name here djm
DB 27,'[33;44m ' ;set color back to normal djm
DB 'Drive: '
DB 27,'[31;43m' ;red on brown djm
HDRVE DB '@' ;drive goes here djm
DB 27,'[33;44m' ;set color back to normal djm
DB 3 DUP (' '),'Date: ' ; djm
DB 27,'[31;43m' ;red on brown djm
D_MM DW '00' ;Month
DB '/'
D_DD DW '00' ;Day
DB '/'
D_YY DW '00' ;Year
DB 27,'[33;44m ' ;color back to normal djm
DB 'Time: '
DB 27,'[31;43m' ;red on brown djm
T_HH DW '00' ;Hours
DB ':'
T_MM DW '00' ;Minutes
DB 27,'[33;44m' ;back to normal djm
DB CR,LF
CRLF DB CR,LF,'$'
HDNG2 DB 'Filespec.ext Bytes- --Last Change--$'
DB 8 DUP(' ')
SPACES DB '$'
RED DB 27,'[31m',CR,LF,'$' ; djm
HDNG3 DB ' File(s)',8 DUP (' '),'$'
HDNG5 DB ' Directory Total',9 DUP (' '),'$' ; djm
HDNG6 DB ' Free Space'
DB 27,'[0;33;44m',CR,LF,'$' ;reset colors djm
OPTHDG DB 27,'[1;25H',27,'[31;43m' ;option headings ;djm
DB 'S O R T E D D I R E C T O R Y' ;djm
DB 27,'[33;44m' ;djm
DB 27,'[3;10HDisplay Options:' ;djm
DB 27,'[5;15H/A Include hidden files' ;djm
DB 27,'[6;15H/R Include directory names' ;djm
DB 27,'[7;15H/M Show only files that have been ' ;djm
DB 'modified since last backup' ;djm
DB 27,'[8;15H/E Don',39,'t erase screen before display'
DB 27,'[9;15H/W Don',39,'t wait when screen is full'
DB 27,'[13;10HSort Options:' ;djm
DB 27,'[15;15H/X Sort by EXTENSION' ;djm
DB 27,'[16;15H/S Sort by SIZE' ;djm
DB 27,'[17;15H/D Sort by DATE and time' ;djm
DB 27,'[18;15H/N No sort' ;djm
DB 27,'[20;1H$' ;djm
SUBTTL DISK TRANSFER AREA & FREE SPACE ENTRY DEFS
PAGE
XFCB DB -1,7 DUP(0),11 DUP('?'),25 DUP(0)
ATTRIB EQU XFCB+6 ;file attribute
DRVNBR EQU ATTRIB+1 ;drive # (1=A, 2=B, etc.)
DTA DB 40 DUP(0) ;Disk Transfer Area used
FILNAME EQU DTA+8 ;by SRCHDIR for the
FILTIME EQU DTA+30 ;directory search.
FILSIZE EQU DTA+36
FILATR EQU DTA+19
FREESPC DW 0 ;Free space entry.
DB '*FREE SPACE*',4 DUP(0)
LOSIZE DW 0 ;of free space
HISIZE DW 0 ;of free space
SUBTTL MAIN PROGRAM SECTION
PAGE
STARTS:
PUSH DS ;Set up the
XOR AX,AX ; stack for a
PUSH AX ; return to DOS.
CALL GETARGS ;Process arguments
CALL SRCHDIR ;Search directory
CMP SRTFLG,0 ;Check if any sort
JZ A1 ; option selected.
CALL LNKDIRB ;Leave in original
JMP SHORT A2 ; directory order.
A1: CALL SRTDIRB ;Sort by major key
A2: MOV AL,OPTFLG ;See if only options wanted djm
OR AL,AL ;See if H request for help djm
JZ A3 ;Wasn't djm
CALL SHOWOPT ;Show option screen djm
JMP SHORT A99 ;get out djm
A3: CALL GETFREE ;Get free space
CALL SPLTLST ;Set up for 2 columns
CALL PRTHDNG ;Print headings
CALL PRTDRVR ;Print detail lines
CALL PRTNFLS ;Print # of files
A99: RET ;Return to DOS
MAIN ENDP
SUBTTL SHOWOPT - SHOW OPTIONS
SHOWOPT PROC NEAR ; djm
DOSCALL @STROUT,CLS ;clear the screen djm
DOSCALL @STROUT,SCRCOL ;make screen colorful djm
DOSCALL @STROUT,OPTHDG ;display options djm
RET
SHOWOPT ENDP
SUBTTL GETARGS - PROCESS ARGUMENTS
PAGE
GETARGS PROC NEAR
MOV SI,PARAM_B ;point to cmd buffer
MOV DI,OFFSET DRVNBR ;point to FCB
MOV AL, 1111B ;Select parse options
DOSCALL @PARSEF ;Parse filename
CMP BYTE PTR [DI],0 ;If <> 0 then
JNZ B1 ; not default drive
DOSCALL @GETDSK ;AL <- default disk
INC AL ;Increment drive #
STOSB ;Save drive #
B1: MOV SI,PARAM_L ;SI <- ptr cmd length
MOV CH,0
MOV CL,[SI] ;CL <- # chars in cmd
JCXZ B99 ; djm
B2: INC SI ;Point to next char
CMP BYTE PTR [SI],'/'
JNZ B8 ;If not a slash
MOV AL,[SI+1] ;AL <- option letter
AND AL,0DFH ;Force to upper-case
CMP AL,'A' ;Hidden & system files?
JNZ B31 ;Nope, try next one. djm
OR BYTE PTR ATTRIB,2+4 ;Hidden & system djm
B31: CMP AL,'R' ;directory entries? djm
JNZ B3 ;Nope, try next one. djm
OR BYTE PTR ATTRIB,10H ;Directory djm
B3: CMP AL,'E' ;Without screen erase?
JNZ B4 ;Nope, try next one.
MOV CLSFLG,AL
B4: CMP AL,'S' ;Sort by size?
JNZ B5 ;Nope, try next one.
MOV SIZFLG,AL
B5: CMP AL,'D' ;Sort by date/time?
JNZ B6 ;Nope, try next one.
MOV DTEFLG,AL
B6: CMP AL,'X' ;Sort by extension?
JNZ B7 ;Nope, try next one.
MOV EXTFLG,AL
B7: CMP AL,'N' ;Original order?
JNZ B8 ;Nope, try next one.
MOV SRTFLG,AL
B8: CMP AL,'W' ;Wait when screen full?
JNZ B9 ;Nope, try next one.
MOV AL,0 ;put zero in al djm
MOV PSEFLG,AL ; djm
B9: CMP AL,'M' ;Just show modified entries? djm
JNZ B10 ;Nope, try next one. djm
MOV MODFLG,AL ; djm
B10: CMP AL,'H' ;Just show options? djm
JNZ B11 ;Nope, try next one djm
MOV OPTFLG,AL ; djm
B11: LOOP B2 ;Test for another param.
B99: RET
GETARGS ENDP
SUBTTL SRCHDIR - SEARCH DIRECTORY
PAGE
SRCHDIR PROC NEAR
MOV BH,ATTRIB ;save attrib djm
MOV BYTE PTR ATTRIB,8 ;get volume label djm
DOSCALL @SETDTA,DTA djm
DOSCALL @SRCH1,XFCB ;get volume label djm
OR AL,AL ;found it? djm
JNZ C11 ;none found djm
MOV SI,OFFSET FILNAME ;source field djm
MOV DI,OFFSET VOLLOC ;put in vol label djm
MOV CX,11 ;length djm
CLD ;clear direction flag djm
REPZ MOVSB ;do it djm
C11: MOV ATTRIB,BH ;restore attribute djm
DOSCALL @SETDTA,DTA ;Set DTA for dir. search
DOSCALL @SRCH1,XFCB ;First call to search dir.
C1: OR AL,AL
JZ C21 ;found djm
JMP C2 ;not found - quit looking djm
C21: MOV BX,DIRLNK ;BX <- base of DIRBUF
LEA DI,[BX].NAM
MOV SI,OFFSET FILNAME
MOV AL,[SI] ;get first byte of entry djm
CMP AL,'.' ;see if sub directory entry djm
JZ C41 ;yes - skip djm
MOV CX,SIZE NAM
CLD
REPZ MOVSB ;Move filename to DIRBUF
MOV AL,FILATR ;load file attributes djm
TEST AL,20h ;see if attr bit set djm
JZ C3 ;no djm
MOV BYTE PTR [DI],'+' ; djm
JMP SHORT C4 ; djm
C3: ; not modified - now see if /M set djm
CMP MODFLG,0 ;see if /M set djm
JNE C41 ;wasn't djm
TEST AL,10H ;see if directory entry djm
JZ C31 ;no djm
MOV BYTE PTR [DI],'-' ;store a minus for dir djm
JMP SHORT C4 ; djm
C31: MOV BYTE PTR [DI],'.' ; Store a period
C4: INC DI
MOV CX,SIZE EXT
REPZ MOVSB ;Move ext to DIRBUF
MOV SI,OFFSET FILTIME
MOVSW ;Move time to DIRBUF
MOVSW ;Move date to DIRBUF
MOV SI,OFFSET FILSIZE
MOV AX,[SI] ;get number for size addition djm
ADD TOTL,AX ;add djm
MOVSW ;Move size to DIRBUF
MOV AX,[SI] ;get high order djm
ADC TOTH,AX ;add djm
MOVSW
ADD BX,SIZE DIRNTRY ;Point to next entry
MOV DIRLNK,BX ;Save ptr
INC NBRFILS ;Increment file count
C41: DOSCALL @SRCH2,XFCB ;Search for next file
JMP C1 ;Loop for next one
C2: RET
SRCHDIR ENDP
SUBTTL SRTDIRB - SORTS ENTRIES IN DIRBUF
PAGE
SRTDIRB PROC NEAR ;Sorts directory entries in DIRBUF
MOV DI,OFFSET DIRBUF ;Point to DIRBUF
D1: CMP DI,DIRLNK ;Are there anymore?
JNC D8 ;NO, exit
MOV SI,OFFSET C1LNK ;Start with column 1 ptr
D2: MOV BX,SI
MOV SI,[BX] ;SI<-ptr to next entry
OR SI,SI
JZ D7 ;if link=0
MOV AX,SI
MOV DX,DI
XOR CL,CL ;CL <- 0
CMP CL,SIZFLG
JNZ D5 ;If sort by size
CMP CL,DTEFLG
JNZ D4 ;If sort by date/time
CMP CL,EXTFLG
JNZ D3 ;If sort by ext
LEA SI,[SI].NAM
LEA DI,[DI].NAM
MOV CX,1+SIZE NAM+SIZE EXT ;# of bytes
JMP SHORT D6
D3: LEA SI,[SI].EXT ;Sort by extension
LEA DI,[DI].EXT
MOV CX,SIZE EXT ;# of bytes
JMP SHORT D6
D4: LEA SI,[SI].DTE ;Sort by date/time
LEA DI,[DI].DTE
MOV CX,2 ;# of words
STD
REPZ CMPSW
MOV DI,DX
MOV SI,AX
JBE D2
JMP SHORT D7
D5: LEA SI,[SI].SZH ;Sort by size
LEA DI,[DI].SZH
MOV CX,2 ;# of words
STD
REPZ CMPSW
MOV DI,DX
MOV SI,AX
JBE D2
JMP SHORT D7
D6: CLD ;Sort by name.ext
REPZ CMPSB
MOV DI,DX
MOV SI,AX
JBE D2
D7: MOV [DI],SI
MOV [BX],DI
ADD DI,SIZE DIRNTRY ;Point to next entry
JMP D1
D8: RET
SRTDIRB ENDP
SUBTTL
PAGE
; LNKDIRB - LINKS ENTRIES IN DIRBUF
LNKDIRB PROC NEAR ;LINK ENTRIES IN DIRBUF
MOV DI,OFFSET DIRBUF
MOV C1LNK,DI ;Point to 1st entry
MOV CX,NBRFILS ;Set loop counter
DEC CX
LNK1: MOV BX,DI
ADD DI,SIZE DIRNTRY ;Offset to next entry
MOV [BX],DI ;Store ptr
LOOP LNK1 ;Link next entry
MOV [DI],CX ;Last ptr <- null
RET
LNKDIRB ENDP
; SPLTLST - SPLITS LINKED LIST IN HALF
SPLTLST PROC NEAR
MOV CX,NBRFILS ;Get # of entries
SAR CX,1 ; and divide by 2
JZ F2 ;if NBRFILS < 2
ADC CL,0 ;Account for odd #
MOV BX,OFFSET C1LNK
F1: MOV BX,[BX] ;Chain thru list to
LOOP F1 ; last row of column 1.
MOV AX,[BX] ;Get ptr to 1st row of col 2
MOV C2LNK,AX ; C2LNK <- R1,C2 ptr
MOV [BX],CX ;Last row of col 1 <- null
F2: RET
SPLTLST ENDP
SUBTTL GETFREE - GET DISK FREE SPACE
GETFREE PROC NEAR ;cluster = allocation unit
MOV DL,DRVNBR ;Get drive #
PUSH DS ;Save DS
DOSCALL @DSKFSP ;get disk free space JYF
MUL BX ;AX (sectors/clustor) * BX (free cluJYF
MOV DX,AX ; JYF
MUL CX ;AX * CX (bytes/clustor) JYF
E5: ; JYF
POP DS ;Restore DS
MOV LOSIZE,AX ;Save the 32 bit
MOV HISIZE,DX ; binary free space
RET
GETFREE ENDP
SUBTTL PRTHDNG - PRINT HEADINGS
PAGE
PRTHDNG PROC NEAR
MOV AL,CLSFLG
OR AL,AL
JNZ G1 ;If not erase screen
DOSCALL @STROUT,CLS ;clear screen for 2.0 djm
G1: MOV AL,DRVNBR ;Get drive #
ADD HDRVE,AL ;Convert to ascii
DOSCALL @GETDTE ; CX<-year, DH<-month, DL<-day
MOV AL,DH
AAM
XCHG AL,AH
OR D_MM,AX ;Fold into month
MOV AL,DL
AAM
XCHG AL,AH
OR D_DD,AX ;Fold into day
MOV AX,CX
SUB AX,1900
AAM
XCHG AL,AH
OR D_YY,AX ;Fold into year
DOSCALL @GETTME ; CH<-hours, CL<-minutes
MOV AL,CH ;AL<-binary hours
AAM ;Convert AL to two
XCHG AL,AH ; BCD digits in AX.
OR T_HH,AX ;Fold into hours
MOV AL,CL ;AL<-binary minutes
AAM ;Convert AL to two
XCHG AL,AH ; BCD digits in AX.
OR T_MM,AX ;Fold into minutes
DOSCALL @STROUT,SCRCOL ;make screen colorful djm
MOV DL,DRVNBR ;set dl to current drive djm
MOV SI,OFFSET DIRWRK ;point to work area djm
DOSCALL @GETDIR ;get directory djm
MOV AL,[SI] ;get 1st char djm
CMP AL,0 ;see if no directory name djm
JNE G11 ;this is root directory djm
MOV SI,OFFSET ROOT ;get * * ROOT * * djm
G11: MOV DI,OFFSET DIRLOC ; djm
CLD ;clear direction flag djm
MOV CX,17 ; djm
REPZ MOVSB ; djm
DOSCALL @STROUT,HDNG1 ;Print main heading
DOSCALL @STROUT,HDNG2 ;Print column 1 heading
CMP WORD PTR C2LNK,0
JZ G2 ;If not 2 columns
DOSCALL @STROUT,SPACES-5 ;Print 5 spaces
DOSCALL @STROUT,HDNG2 ;Print column 2 heading
G2: DOSCALL @STROUT,CRLF ;Start a new line
RET
PRTHDNG ENDP
SUBTTL PRINT DETAIL LINES
PAGE
PRTDRVR PROC NEAR ;Driver routine
MOV BX,C1LNK
OR BX,BX ;more to print?
JZ H2 ; no, return
MOV AX,[BX]
MOV C1LNK,AX
CALL PRTDTL ;print column one
MOV BX,C2LNK
OR BX,BX
JZ H1 ;If no column 2 entry
DOSCALL @STROUT,SPACES-5 ;print 5 spaces
MOV AX,[BX]
MOV C2LNK,AX
CALL PRTDTL ;print column two
H1: DOSCALL @STROUT,CRLF
CMP PSEFLG,0 ;Check for pause option
JZ PRTDRVR ;Nope, continue
DEC LINCNT ;Decrement line counter
JNZ PRTDRVR ;If page not full?
MOV LINCNT,LPERSCR-2 ;Reset to # lines/screen
DOSCALL @STROUT,PSEMSG ;Display pause message.
MOV AL,@KEYIN ;Specify input function
DOSCALL @CKEYIN ;Wait for key press
DOSCALL @STROUT,CRLF ;Set to new line
JMP PRTDRVR ;Go do the next line
H2: RET
PRTDRVR ENDP
PRTDTL PROC NEAR ;Prints file.ext, size, date & time
MOV AL,[BX][0AH] ;get file.ext separator djm
CMP AL,'-' ;see if minus inserted djm
JNZ SHORT I0 ;not a Dir entry djm
MOV BYTE PTR [BX][0AH],' ' ;clear minus sign djm
DOSCALL @STROUT,HI_INT ;set next chars to high intensity djm
OR DIRSW,1 ;set switch on djm
I0: MOV CX,1+SIZE NAM+SIZE EXT
SUB DI,DI ;DI <- 0
I1: DOSCALL @CHROUT,[BX+DI].NAM
INC DI ;point to next char.
LOOP I1 ;go do next char.
CMP DIRSW,1 ;see if this is directory entry djm
JNZ I11 ;no djm
DOSCALL @STROUT,SPACES-8 ;print 8 spaces instead of size djm
JMP SHORT I12
I11: PUSH BX ;save entry base
MOV SI,[BX].SZL ;SI <- low size
MOV DI,[BX].SZH ;DI <- high size
CALL PRINTDD ;Print size
POP BX ;restore entry base
I12: DOSCALL @STROUT,SPACES-2 ;print 2 spaces
MOV AX,[BX].DTE ;AX <- packed date
CALL PRTDTE
DOSCALL @STROUT,SPACES-2 ;print 2 spaces
MOV AX,[BX].TME ;AX <- packed time
CALL PRTTME
CMP DIRSW,1 ;see if switch on djm
JNZ I2 ;no djm
MOV DIRSW,0 ;shut off switch djm
DOSCALL @STROUT,BROWN ;put back screen color djm
I2: RET
PRTDTL ENDP
SUBTTL PRINTDD - PRINT A DOUBLE WORD IN DI:SI
PAGE
PRINTDD PROC NEAR ;Prints a 32 bit integer in DI:SI
XOR AX,AX ;Zero out the
MOV BX,AX ; working
MOV BP,AX ; registers.
MOV CX,32 ;# bits of precision
J1: SHL SI,1
RCL DI,1
XCHG BP,AX
CALL J6
XCHG BP,AX
XCHG BX,AX
CALL J6
XCHG BX,AX
ADC AL,0
LOOP J1
MOV CX,1710H ;5904 ?
MOV AX,BX
CALL J2
MOV AX,BP
J2: PUSH AX
MOV DL,AH
CALL J3
POP DX
J3: MOV DH,DL
SHR DL,1 ;Move high
SHR DL,1 ; nibble to
SHR DL,1 ; the low
SHR DL,1 ; position.
CALL J4
MOV DL,DH
J4: AND DL,0FH ;Mask low nibble
JZ J5 ;If not zero
MOV CL,0
J5: DEC CH
AND CL,CH
OR DL,'0' ;Fold in ASCII zero
SUB DL,CL
DOSCALL @CHROUT ;Print next digit
RET ;Exit to caller
PRINTDD ENDP
J6 PROC NEAR
ADC AL,AL
DAA
XCHG AL,AH
ADC AL,AL
DAA
XCHG AL,AH
RET
J6 ENDP
SUBTTL PRINT DATE, TIME & # FILES ROUTINES
PAGE
PRTDTE PROC NEAR ;Print packed date in AX as MM/DD/YY
OR AX,AX
JNZ K1 ;If date <> 0
DOSCALL @STROUT,SPACES-8 ;Print 8 spaces
RET
K1: PUSH AX
AND AX,MASK P_MO ;Mask the month,
MOV CL,P_MO ; set shift count,
SHR AX,CL ; right justify, &
CALL PRTBCD ; print it.
DOSCALL @CHROUT,'/'
POP AX
PUSH AX
AND AX,MASK P_DY ;Mask the day &
CALL PRTBCD ; print it.
DOSCALL @CHROUT,'/'
POP AX
AND AX,MASK P_YR ;Mask the year,
MOV CL,P_YR ; set shift count,
SHR AX,CL ; right justify,
ADD AX,80 ; add in year bias, &
; print it.
PRTBCD: AAM ;Convert AL to BCD
OR AX,'00' ;Convert to ASCII
PUSH AX
DOSCALL @CHROUT,AH ;High order digit
POP AX
DOSCALL @CHROUT,AL ;Low order digit
RET
PRTDTE ENDP
PRTTME PROC NEAR ;Print packed time in AX as HH:MM
OR AX,AX
JNZ L1
DOSCALL @STROUT,SPACES-5 ;Print 5 spaces
RET
L1: PUSH AX
AND AX,MASK P_HR ;Mask the hours,
MOV CL,P_HR ; set shift count,
SHR AX,CL ; right justify, &
CALL PRTBCD ; print it.
DOSCALL @CHROUT,':'
POP AX
AND AX,MASK P_MI ;Mask the minutes,
MOV CL,P_MI ; set shift count,
SHR AX,CL ; right justify, &
CALL PRTBCD ; print it.
RET
PRTTME ENDP
PAGE
PRTNFLS PROC NEAR ;print number of files
DOSCALL @STROUT,RED ;setup color djm
MOV SI,NBRFILS ;get # of files
XOR DI,DI ;zero high order
CALL PRINTDD ;Print # of files
DOSCALL @STROUT,HDNG3
MOV SI,TOTL ;set up total for print djm
MOV DI,TOTH ; djm
CALL PRINTDD ;print total space used by dir djm
DOSCALL @STROUT,HDNG5 ; djm
MOV SI,LOSIZE ;free space djm
MOV DI,HISIZE ; djm
CALL PRINTDD ;print free space djm
DOSCALL @STROUT,HDNG6 ; djm
RET
PRTNFLS ENDP
EVEN
DIRBUF DIRNTRY <> ;Buffer for directory entries
SDIR ENDS
END MAIN
XA 6:
PRTNFLS ENDP
EVEN
DIRBUF DIRNTRY <> ;Buffer fo